//
// Created by konglinglong on 2020/9/8.
//

#ifndef CSP_LIB_CSP_INCLUDE_UTILS_VARRINGBUFFER_H
#define CSP_LIB_CSP_INCLUDE_UTILS_VARRINGBUFFER_H

#include "commDef.h"

#ifdef __cplusplus
extern "C"
{
#endif

/******************************************************************************
 variable ring buffer : 采用无锁方式实现的变长环形缓冲，提供零拷贝接口，
                        提供有边界的数据处理。
                        可用于NONE(没竞争，生产者、消费者为同一线程)、SPSC(单生产者--单消费者)、
                        MPSC(多生产者--单消费者)场景。
 ******************************************************************************/
enum
{
    VAR_RB_TYPE_NONE = CSP_CONCURRENCY_TYPE_NONE, /* 没竞争，生产者、消费者为同一线程 */
    VAR_RB_TYPE_SPSC = CSP_CONCURRENCY_TYPE_SPSC, /* 单生产者，单消费者 */
    VAR_RB_TYPE_MPSC = CSP_CONCURRENCY_TYPE_MPSC, /* 多生产者，单消费者 */
};

typedef struct VarRingBuffer S_VarRingBuffer;

S_VarRingBuffer* VarRB_Create(const char* shmId, uint32_t size, uint32_t type);
void VarRB_Destroy(S_VarRingBuffer* self);
void* VarRB_WriteRequest(S_VarRingBuffer* self, uint32_t size);
int32_t VarRB_WriteCommit(S_VarRingBuffer* self, void* chunk);
void* VarRB_ReadRequest(S_VarRingBuffer* self, uint32_t* size);
int32_t VarRB_ReadConsume(S_VarRingBuffer* self, void* chunk);
int32_t VarRB_Put(S_VarRingBuffer* self, void* data, uint32_t size);
int32_t VarRB_Get(S_VarRingBuffer* self, void* buffer, uint32_t* size);
uint32_t VarRB_Count(S_VarRingBuffer* self);
void VarRB_Dump(S_VarRingBuffer* self, void* buffer, uint32_t size);

#ifdef __cplusplus
}
#endif

#endif //CSP_LIB_CSP_INCLUDE_UTILS_VARRINGBUFFER_H
